﻿// 检查是否是VBA代码
function isVBACode(code) {
    // 去除注释
    code = code.replace(/'.*$/gm, '');

    // 匹配 Sub 或 Function 块
    const pattern = /^\s*(Sub|Function)\b[\s\S]*?(End (Sub|Function))\s*$/i;
    return pattern.test(code);
}


// 创建运行按钮
function createRunButton(preElement) {
    const btn = document.createElement('div');
    btn.className = 'ds-markdown-code-run-button';
    btn.textContent = '运行';
    btn.style.cssText = `
        color: #fff;
        background: #4CAF50;
        padding: 2px 8px;
        border-radius: 4px;
        cursor: pointer;
        margin-right: 8px;
    `;

    btn.addEventListener('click', () => {
        const code = preElement.textContent.trim();

        // 检查是否是VBA代码
        if (isVBACode(code)) {
            // 将 VBA 代码进行 URL 编码
            const encodedCode = encodeURIComponent(code);

            // 将 VBA 代码发送给 C# 后端
            window.chrome.webview.postMessage({
                type: 'runVBA',
                code: encodedCode // 传输编码后的 VBA 代码
            });
        } else {
            alert('这不是有效的VBA代码');
        }
    });
    return btn;
}

// 创建收藏按钮
function createFavoriteButton(preElement) {
    const btn = document.createElement('div');
    btn.className = 'ds-markdown-code-favorite-button';
    btn.textContent = '收藏';
    btn.style.cssText = `
        color: #fff;
        background: #FFA500;
        padding: 2px 8px;
        border-radius: 4px;
        cursor: pointer;
        margin-right: 8px;
    `;

    btn.addEventListener('click', () => {
        const code = preElement.textContent.trim();

        // 检查是否是VBA代码
        if (isVBACode(code)) {
            // 将 VBA 代码发送给 C# 后端
            window.chrome.webview.postMessage({
                type: 'favoriteVBA',
                code: code
            });
        } else {
            alert('这不是有效的VBA代码');
        }
    });
    return btn;
}

// 创建引用按钮
function createQuoteButton() {
    const btn = document.createElement('div');
    btn.className = 'ds-markdown-code-quote-button';
    btn.textContent = '📎';
    btn.style.marginRight = '10px';
    btn.style.cursor = 'pointer';
    btn.style.color = '#007bff';
    btn.style.fontSize = '20px'; // 增大按钮尺寸
    btn.style.padding = '5px'; // 增大按钮尺寸

    btn.addEventListener('click', () => {
        console.log('点击了引用按钮，发送 getSelection 消息');
        window.chrome.webview.postMessage({
            type: 'getSelection'
        });
    });

    return btn;
}

// 将引用按钮添加到聊天框底部
function addQuoteButtonToChatFooter() {
    const chatFooter = document.querySelector('.bf38813a'); // 聊天框底部容器
    if (chatFooter && !chatFooter.querySelector('.ds-markdown-code-quote-button')) {
        const quoteBtn = createQuoteButton();
        chatFooter.appendChild(quoteBtn); // 将引用按钮添加到聊天框底部
    }
}

// 创建“导出”按钮
function addExportButton() {
    const markdownContainers = document.querySelectorAll('.ds-markdown.ds-markdown--block');
    markdownContainers.forEach(container => {
        if (container.nextElementSibling && container.nextElementSibling.classList.contains('export-button-added')) {
            return;
        }

        const exportButton = document.createElement('button');
        exportButton.textContent = '导出';
        exportButton.classList.add('export-button-added');
        exportButton.style.marginTop = '10px';
        exportButton.style.padding = '5px 10px';
        exportButton.style.backgroundColor = '#28a745';
        exportButton.style.color = '#fff';
        exportButton.style.border = 'none';
        exportButton.style.borderRadius = '5px';
        exportButton.style.cursor = 'pointer';

        exportButton.addEventListener('click', function () {
            const markdownText = container.innerText;
            window.chrome.webview.postMessage({ type: 'exportText', text: markdownText });
        });

        container.parentNode.insertBefore(exportButton, container.nextSibling);
    });
}
// 修改主函数，添加上传按钮
function init() {
    document.querySelectorAll('.md-code-block').forEach(block => {
        if (block.querySelector('.ds-markdown-code-run-button')) {
            return; // 如果已经添加过按钮，跳过
        }

        const preElement = block.querySelector('pre');
        const copyBtn = block.querySelector('.ds-markdown-code-copy-button');

        if (!preElement || !copyBtn) return;

        const code = preElement.textContent.trim();
        if (isVBACode(code)) {
            const actionsDiv = copyBtn.parentElement;
            const runBtn = createRunButton(preElement);
            const favoriteBtn = createFavoriteButton(preElement);
            actionsDiv.insertBefore(favoriteBtn, copyBtn);
            actionsDiv.insertBefore(runBtn, favoriteBtn);
        }
    });

    // 调用 addExportButton 以确保每个 Markdown 容器都有一个导出按钮
    addExportButton();

    // 将引用按钮添加到聊天框底部
    addQuoteButtonToChatFooter();

    // 添加全局上传按钮到工具栏
    addGlobalUploadButton();
}
// 创建全局上传按钮并添加到适当位置
function addGlobalUploadButton() {
    const chatFooter = document.querySelector('.bf38813a'); // 聊天框底部容器
    if (chatFooter && !chatFooter.querySelector('.ds-global-upload-button')) {
        const uploadBtn = document.createElement('div');
        uploadBtn.className = 'ds-global-upload-button';
        uploadBtn.textContent = '📤';
        uploadBtn.title = '上传Excel';
        uploadBtn.style.cssText = `
                        margin-right: 10px;
                        cursor: pointer;
                        color: #007bff;
                        font-size: 20px;
                        padding: 5px;
                    `;
        //发送到C#后端，请求上传当前文件
        uploadBtn.addEventListener('click', () => {
            window.chrome.webview.postMessage({
                type: 'uploadWorkbook'
            });
        });

        chatFooter.appendChild(uploadBtn);
    }
}

// 自定义上传函数 - 接收来自C#的文件数据并直接上传
window.directUploadExcelFile = function (fileData, fileName, fileType) {
    try {
        // 查找文件上传控件
        const fileInput = document.querySelector('input[type=\"file\"]');
        if (!fileInput) {
            window.chrome.webview.postMessage({
                type: 'uploadError',
                message: '未找到文件上传控件'
            });
            return;
        }

        // 创建包含文件数据的Blob对象
        const blob = base64ToBlob(fileData, fileType);

        // 创建包含文件的DataTransfer对象
        const dt = new DataTransfer();
        const file = new File([blob], fileName, { type: fileType });
        dt.items.add(file);

        // 将DataTransfer对象分配给文件输入元素
        fileInput.files = dt.files;

        // 触发change事件
        const event = new Event('change', { bubbles: true });
        fileInput.dispatchEvent(event);

        // 通知上传成功
        window.chrome.webview.postMessage({
            type: 'uploadStarted',
            fileName: fileName
        });

        // 对于某些网站可能需要自动提交表单
        const form = fileInput.closest('form');
        if (form) {
            // 可选：延迟提交表单
            setTimeout(() => {
                form.submit();
            }, 500);
        }
    } catch (error) {
        window.chrome.webview.postMessage({
            type: 'uploadError',
            message: '上传过程中出错: ' + error.message
        });
    }
};

// Base64字符串转Blob对象
function base64ToBlob(base64, mimeType) {
    // 解码Base64字符串
    const byteCharacters = atob(base64);
    const byteArrays = [];

    for (let offset = 0; offset < byteCharacters.length; offset += 1024) {
        const slice = byteCharacters.slice(offset, offset + 1024);

        const byteNumbers = new Array(slice.length);
        for (let i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        const byteArray = new Uint8Array(byteNumbers);
        byteArrays.push(byteArray);
    }

    return new Blob(byteArrays, { type: mimeType });
} 

// 监听来自C#后端的消息
window.chrome.webview.addEventListener('message', (event) => {
    const data = event.data;

    if (data.type === 'excelSelection') {
        const textarea = document.getElementById('chat-input');
        if (textarea) {
            // 将Excel选择范围内的数据插入到textarea中
            textarea.value = data.text;

            // 手动触发 input 事件，以更新发送按钮的状态
            const inputEvent = new Event('input', { bubbles: true });
            textarea.dispatchEvent(inputEvent);
        } else {
            console.error('未找到ID为 chat-input 的 textarea 元素');
        }
    }
});

// 使用MutationObserver监听动态加载的内容
const observer = new MutationObserver((mutationsList) => {
    for (const mutation of mutationsList) {
        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
            // 延迟执行init，避免频繁调用
            setTimeout(init, 100);
            break;
        }
    }
});

// 观察整个文档的变化
observer.observe(document.body, {
    childList: true,
    subtree: true
});

// 初始执行
init();